<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 为什么函数可以通过点语法使用call bind apply??? 函数.call() Function.prototype的原型有call bind apply方法
    // 1. 借用函数 2. 改变this指向
    // var fn = new Function()
    // var fn = function() {}
    // 理解这个call的由来之后 我们封装自己call 
    Function.prototype.mycall = function (that = window, ...arg) {
      // console.log(arg, '猜测写结果') [9, 99]
      // 如果没有传递参数 that就是window 如果传递值
      // step1 要搞清楚this是谁 setp2 对象方法中this的指向对象
      // console.log(this) // this就是fn这个函数
      that.ff = this // 将fn赋值给that上ff属性 that = {ff: function fn() {console.log(this)}}
      // 调用就可以了 
      // that.ff就是fn这个函数 然后调用that.ff就会调用fn这个函数 就实现了借用的功能
      // ff这个函数中的this执行的就是调用者 就是that
      that.ff(...arg) // 此时此刻应该传递参数that.ff(9, 99)

      // 调用完毕后 删除即可
      delete that.ff
    }
    function fn (a, b) { 
      console.log('hello', this, a, b)
    }
    var obj = {a: 'hello'}
    fn.mycall(obj, 9, 99) // 

   /*  var obj = {
      say () {
        console.log(this, 111)
      }
    }
    obj.say() */
    /* var o = {}
    o.name = 'zs'
    o.say = function () {} */
  </script>
</body>
</html>
